package my.test;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理测试2 代理目标为接口
 */
public class ProxyTest2 {
    public static void main(String[] args) {
        Woman proxy = createProxy(Woman.class);
        proxy.say();
    }

    @SuppressWarnings("unchecked")
    public static <T> T createProxy(Class<T> clazz) {
        return (T) Proxy.newProxyInstance(
                clazz.getClassLoader(),
                new Class[]{clazz}, // 关键：自己就是接口
                (proxy, method, args) -> {
                    String name = method.getName();
                    if ("say".equals(name)) {
                        System.out.println("调用" + name + "之前。。。");
                        myInvoke(method, args);
                        System.out.println("调用" + name + "之后。。。");
                    }
                    return null;
                }
        );
    }

    public static void myInvoke(Method method, Object[] args) {
        String name = method.getName();
        System.out.println("这个" + name + "，我们根据传入的args=" + args + "，想怎么实现就怎么实现。");
    }
}

/**
 * 定义一个接口
 */
interface Woman {
    void say();
}
